package net.sk.cam;

import org.apache.mina.core.buffer.IoBuffer;

public class FrameHeader {
	public static final int LEN = 212;
	public static final short FRAME_TYPE_NORMAL = 0;
	public static final short FRAME_TYPE_SNAP = 1;
	public static final short FRAME_TYPE_HEART = 2;

	public short getFrame_type() {
		return frame_type;
	}
	public void setFrame_type(short frame_type) {
		this.frame_type = frame_type;
	}
	public long getLen() {
		return len;
	}
	public void setLen(long len) {
		this.len = len;
	}

	
	
	public long getDevice_no() {
		return device_no;
	}
	public void setDevice_no(long device_no) {
		this.device_no = device_no;
	}



	short w; // 图像宽(占2个字节)
	short h; // 图像高(占2个字节)

	short bits; // 图像位数8~16bits(占2个字节)
	short format; // 图像类型代码(0--灰度，1--Bayer_RG，	2--Bayer_GR，3--Bayer_BG，5--RGB，6--YUV422，7--JPEG) (占2个字节)
	short frame_type; // 帧类型(0--普通，1--抓拍图像，2--心跳帧) (占2个字节)
	short frame_rev; // 保留(占2个字节)
	long  firmware_version; //固件程序版本(占4个字节)
	long  device_no; // 设备编号(占4个字节)

	long  len; // 图像数据长度(占4个字节)

	long  speed; // 双线圈测速值(us) (占4个字节)
	long  rs232; // 串口信息(1~4字节)(占4个字节)

	short year;  // 图像采集时间(占2个字节)
	short month; //月份(占2个字节)
	short day;   // 日期(占2个字节)
	short hour;  // 小时(占2个字节)
	short minute;// 分钟(占2个字节)
	short second;// 秒数(占2个字节)

	long ip; // 采集当前帧的摄像机IP(占4个字节)
	long frame_count; //总共的抓拍帧数目(占4个字节)
	long trigger_count; //总共的触发数(占4个字节)
	long trigger_index; //触发组索引(占4个字节)
	long frame_no; //帧号(占4个字节)

	long gain; //当前抓拍参数(占4个字节)
	long time; //曝光时间(占4个字节)
	long gain_r; //红增益(占4个字节)
	long gain_g; //绿增益(占4个字节)
	long gain_b; //蓝增益(占4个字节)

	long mode; // 摄像机工作模式(占4个字节)
	long JpegQ; // JPEG压缩品质(占4个字节)
	long td1; // 抓拍延时(单位us) (占4个字节)
	long td2; // 曝光延时(单位us) (占4个字节)

	long trig_chl; //触发通道(占4个字节)
	long msecond; //ms计时(占4个字节)
	long yavg; //平均亮度(占4个字节)
	long mpeg_head; //(占4个字节)
	long[] rev; //保留参数(占32个字节)
	int[] user_info; // 用户数据(占64个字节)


	private static byte[] shortToByteArray(short s) {
	   byte[] shortBuf = new byte[2];
	   for(int i=0;i<2;i++) {
	   int offset = (shortBuf.length - 1 -i)*8;
	   shortBuf[i] = (byte)((s>>>offset)&0xff);
	   }
	   return shortBuf;
	  }
	   public static final int byteArrayToShort(byte b0,byte b1) {
	    return (b0 << 8)
	            + (b1 & 0xFF);
	   }
	   public static byte[] intToByteArray(long value){
	    byte[] b = new byte[4];
	     for (int i = 0; i < 4; i++) {
	            int offset = (b.length - 1 - i) * 8;
	             b[i] = (byte) ((value >>> offset) & 0xFF);
	      }
	      return b;
	   }
	  public static final int byteArrayToInt(byte b0,byte b1,byte b2,byte b3) {
       return (b0 << 24)
               + ((b1 & 0xFF) << 16)
               + ((b2 & 0xFF) << 8)
               + (b3 & 0xFF);
	  }
	  public static void putbyte(byte[]target,int pos,byte[]source){
		  for(int i=0; i<source.length; i++){
			  target[pos+i]=source[i];
		  }
	  }
	/**TODO
	 * 从输入流构建帧头
	 * @param in
	 */
	public void decode(IoBuffer in){
		byte[] fhb = new byte[LEN];
		in.get(fhb);
		frame_type = (short)byteArrayToShort(fhb[8],fhb[9]);
		device_no = byteArrayToInt(fhb[16],fhb[17],fhb[18],fhb[19]);
		len = byteArrayToInt(fhb[20],fhb[21],fhb[22],fhb[23]);
	}
	/**TODO
	 * 流出
	 * @return
	 */
	public byte[]  encode(){
		byte[] fhb = new byte[LEN];
		byte[] b_frame_type = shortToByteArray(frame_type);
		putbyte(fhb,8,b_frame_type);
		fhb[8]=b_frame_type[0];
		fhb[9]=b_frame_type[1];
		byte[] b_device_no = intToByteArray(device_no);
		putbyte(fhb,16,b_device_no);
		byte[] b_len = intToByteArray(len);
		putbyte(fhb,20,b_len);
		return fhb;
	}
}
